/**    
 * 文件名：AccessTokenHelper.java</br>
 *    
 * 版本信息：v1.0</br>
 * 日期：2017年6月28日</br>
 * © 2005-2017 雷技信息科技（上海）有限公司版权所有</br>
 *
 */
package com.logic.landseaserver.common.token;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.logic.landseaserver.domain.SystemAccessToken;

/**
 *
 * 项目名称：system-server</br>
 * 类名称：AccessTokenHelper</br>
 * 类描述：accessToken辅助类</br>
 * 创建人：Aaron</br>
 * 创建时间：2017年6月28日 下午4:00:46</br>
 * @version 1.0
 *
 */
public class AccessTokenHelper
{
    private static AccessTokenHelper instance;
    
    private AccessTokenComponent accessTokenComponent;
    
    /** 存储accessToken的集合 **/
    private Map<String, SystemAccessToken> accessTokenMap;
    
    private AccessTokenHelper()
    {
    }
    
    /**
     * 
     * [简要描述]：获取单例对象</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-06-28)</br>
     *
     * @return AccessTokenHelper
     *
     */
    public static AccessTokenHelper getInstance()
    {
        if (null == instance)
        {
            instance = new AccessTokenHelper();
        }
        
        return instance;
    }
    
    /**
     * 
     * [简要描述]：只会执行一次，轻勿调用</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-06-28)</br>
     *
     * @param list 所有的accessToken集合
     *
     */
    public void init(List<SystemAccessToken> list, AccessTokenComponent component)
    {
        this.accessTokenComponent = component;
        
        if (null == accessTokenMap)
        {
            accessTokenMap = new HashMap<String, SystemAccessToken>();
        }
        accessTokenMap.clear();
        
        if (null == list)
        {
            return;
        }
        
        // key为tokenId，value为SystemAccessToken对象
        for (SystemAccessToken accessToken : list)
        {
            accessTokenMap.put(accessToken.getTokenId(), accessToken);
        }
    }
    
    /**
     * 
     * [简要描述]：获取所有</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-06-28)</br>
     *
     * @return
     *
     */
    public Map<String,SystemAccessToken> getAll()
    {
        return accessTokenMap;
    }
    
    /**
     * 
     * [简要描述]：根据key获取单个accessToken</br>
     * [详细描述]：从缓存获取</br>
     * [作者]：Aaron(2017-06-28)</br>
     *
     * @param tokenId 主键
     * @return SystemAccessToken对象，有可能获取不到返回null
     *
     */
    public SystemAccessToken getFromCache(String tokenId)
    {
        return accessTokenMap.get(tokenId);
    }
    
    public SystemAccessToken getFromDb(String tokenId)
    {
        return accessTokenComponent.queryByTokenId(tokenId);
    }
    
    public void reset(String tokenId, SystemAccessToken accessToken)
    {
        accessTokenMap.put(tokenId, accessToken);
        accessTokenComponent.update(accessToken);
    }
    
    public void resetCache(String tokenId, SystemAccessToken accessToken)
    {
        accessTokenMap.put(tokenId, accessToken);
    }
    
    public void add(String tokenId, SystemAccessToken accessToken)
    {
        accessTokenMap.put(tokenId, accessToken);
        accessTokenComponent.insert(accessToken);
    }
    
    /**
     * 
     * [简要描述]：判断token是否过期</br>
     * [详细描述]：只有当前时间大于过期时间才算是过期</br>
     * [作者]：Aaron(2017-06-28)</br>
     *
     * @param accessToken token对象
     * @return true过期  false没有过期
     *
     */
    public boolean isTokenExpired(SystemAccessToken accessToken)
    {
        long currentLongTime = System.currentTimeMillis();
        return currentLongTime > accessToken.getExpiretime();
    }
}
